/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.maternity.servlets;

import br.com.maternity.classes.dao.AtendimentoDAO;
import br.com.maternity.classes.dao.PacienteDAO;
import br.com.maternity.classes.dao.ResponsavelDAO;
import br.com.maternity.classes.entity.Atendimento;
import br.com.maternity.classes.entity.Paciente;
import br.com.maternity.classes.entity.Responsavel;
import br.com.maternity.util.Parser;
import br.com.maternity.util.Validator;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashSet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 *
 * @author Gattini
 */
@WebServlet(name = "novoAtendimento", urlPatterns = {"/novoAtendimento"})
public class novoAtendimento extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        boolean isNovoPaciente;
        if (Parser.parseString(request.getParameter("hdfId")).isEmpty()) {
            isNovoPaciente = true;
        } else {
            isNovoPaciente = false;
        }

        String nome = Parser.parseString(request.getParameter("txtNome"));
        String cpf = Parser.parseString(request.getParameter("txtCPF"));
        String rg = Parser.parseString(request.getParameter("txtRG"));
        String sNascimento = Parser.parseString(request.getParameter("txtNascimento"));
        String telefone = Parser.parseString(request.getParameter("txtTelefone"));
        String cartaoSus = Parser.parseString(request.getParameter("txtCartaoSUS"));
        String logradouro = Parser.parseString(request.getParameter("txtLogradouro"));
        String numero = Parser.parseString(request.getParameter("txtNumero"));
        String complemento = Parser.parseString(request.getParameter("txtComplemento"));
        String cep = Parser.parseString(request.getParameter("txtCEP"));
        String bairro = Parser.parseString(request.getParameter("txtBairro"));
        String cidade = Parser.parseString(request.getParameter("txtCidade"));
        String uf = Parser.parseString(request.getParameter("txtUF"));
        
        Integer cor = Integer.parseInt(request.getParameter("ddlCor"));
        Integer sexo = Integer.parseInt(request.getParameter("ddlSexo"));
        
        String nomePai = Parser.parseString(request.getParameter("txtNomePai"));
        String nomeMae = Parser.parseString(request.getParameter("txtNomeMae"));

        String msg = "";

        if (nome.isEmpty()) {
            msg += "Nome inválido. ";
        }

        PacienteDAO dao = new PacienteDAO();

        if (cpf.isEmpty()) {
            msg += "CPF inválido. ";
        } else {
            cpf = cpf.replace(".", "").replace("-", "");
            if (!Validator.isCpf(cpf)) {
                msg += "CPF inválido. ";
            } else {
                Paciente old = dao.getByCpf(cpf);
                if (old != null && isNovoPaciente) {
                    msg += "O paciente " + old.getNome() + " já está cadastrado com o CPF informado. ";
                }
            }
        }

        if (rg.isEmpty()) {
            msg += "RG inválido. ";
        }

        boolean precisaResponsavel = true;
        if (sNascimento.isEmpty()) {
            msg += "Data de nascimento inválida. ";
        } else {
            Date dataNascimento = Parser.parseStringToDate(sNascimento);
            if (dataNascimento == null) {
                msg += "Data de nascimento inválida. ";
            } else {
                GregorianCalendar cal = new GregorianCalendar();
                cal.setTime(new Date());
                if (dataNascimento.after(cal.getTime())) {
                    msg += "Data de nascimento inválida. ";
                } else {
                    cal.roll(Calendar.YEAR, -18);
                    if (dataNascimento.before(cal.getTime())) {
                        precisaResponsavel = false;
                    }
                }
            }
        }

        if (telefone.isEmpty()) {
            msg += "Telefone inválido. ";
        }

        if (logradouro.isEmpty()) {
            msg += "Logradouro inválido. ";
        }

        if (numero.isEmpty()) {
            msg += "Número inválido. ";
        }

        if (cep.isEmpty()) {
            msg += "CEP inválido. ";
        }

        if (bairro.isEmpty()) {
            msg += "Bairro inválido. ";
        }

        if (cidade.isEmpty()) {
            msg += "Cidade inválida. ";
        }

        if (uf.isEmpty()) {
            msg += "UF inválida. ";
        }

        if (nomePai.isEmpty()) {
            msg += "Nome do Pai inválido. ";
        }

        if (nomeMae.isEmpty()) {
            msg += "Nome da Mãe inválido. ";
        }

        String respNome = Parser.parseString(request.getParameter("txtRespNome"));
        String respCpf = Parser.parseString(request.getParameter("txtRespCPF"));
        String respLogradouro = Parser.parseString(request.getParameter("txtRespLogradouro"));
        String respNumero = Parser.parseString(request.getParameter("txtRespNumero"));
        String respComplemento = Parser.parseString(request.getParameter("txtRespComplemento"));
        String respCep = Parser.parseString(request.getParameter("txtRespCEP"));
        String respBairro = Parser.parseString(request.getParameter("txtRespBairro"));
        String respCidade = Parser.parseString(request.getParameter("txtRespCidade"));
        String respUf = Parser.parseString(request.getParameter("txtRespUF"));
        if (precisaResponsavel) {
            if (respNome.isEmpty() || respCpf.isEmpty() || respLogradouro.isEmpty()
                    || respNumero.isEmpty() || respCep.isEmpty() || respBairro.isEmpty()
                    || respCidade.isEmpty() || respUf.isEmpty()) {
                msg += "Necessário preenchimento dos dados do responsável, paciente é de menor. ";
            } else {
                respCpf = respCpf.replace(".", "").replace("-", "");
                if (!Validator.isCpf(respCpf))  {
                    msg += "CPF do Responsável inválido. ";
                } else {
                    if (respCpf.equals(cpf)) {
                        msg += "CPF do Responsável é igual ao CPF do Paciente. ";
                    }
                }
            }
        }

        if (!msg.isEmpty()) {
            response.getWriter().write("0|" + msg);
        } else {
            Paciente p;
            if (isNovoPaciente) {
                p = new Paciente();
            } else {
                p = dao.getByProntuario(Integer.parseInt(request.getParameter("hdfId").toString()));
            }

            p.setBairro(bairro);
            p.setCartaoSUS(cartaoSus);
            p.setCep(cep);
            p.setCidade(cidade);
            p.setCidade(cidade);
            p.setComplemento(complemento);
            p.setCor(cor);
            p.setCpf(cpf);
            p.setDataNascimento(Parser.parseStringToDate(sNascimento));
            p.setLogradouro(logradouro);
            p.setNome(nome);
            p.setNomeMae(nomeMae);
            p.setNomePai(nomePai);
            p.setNumero(numero);
            p.setRg(rg);
            p.setSexo(sexo);
            p.setTelefone(telefone);
            p.setUf(uf);
            boolean ok = false;
            if (isNovoPaciente) {
                ok = dao.insert(p);
            } else {
                ok = (dao.update(p) != 0);
            }

            if (ok) {
                Atendimento a = new Atendimento();
                GregorianCalendar cal = new GregorianCalendar();
                cal.setTime(new Date());
                a.setDataAtendimento(cal.getTime());
                a.setIdUnidade(1);
                a.setPrioridade(1);
                a.setProntuarioPaciente(p.getProntuario());
                a.setSituacao(1);

                AtendimentoDAO daoAtendimento = new AtendimentoDAO();
                if (daoAtendimento.insert(a)) {
                    if (precisaResponsavel) {
                        Responsavel r = new Responsavel();
                        r.setBairro(respBairro);
                        r.setCep(respCep);
                        r.setCidade(respCidade);
                        r.setComplemento(respComplemento);
                        r.setCpf(respCpf);
                        r.setIdAtendimento(a.getId());
                        r.setLogradouro(respLogradouro);
                        r.setNome(respNome);
                        r.setNumero(respNumero);
                        r.setUf(respUf);

                        ResponsavelDAO daoResponsavel = new ResponsavelDAO();
                        if (daoResponsavel.insert(r)) {
                            response.getWriter().write("1|" + request.getContextPath() + "/relatorios/listagemPacientes.jsp?cadastrado=true");
                        } else {
                            response.getWriter().write("0|Ocorreu um erro ao salvar o responsável do paciente");
                        }

                    } else {
                        response.getWriter().write("1|" + request.getContextPath() + "/relatorios/listagemPacientes.jsp?cadastrado=true");
                    }
                } else {
                    response.getWriter().write("0|Ocorreu um erro ao gerar o atendimento");
                }
            } else {
                response.getWriter().write("0|Ocorreu um erro ao cadastrar o paciente");
            }
        }


    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
